package util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.Calendar;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import dao.BdDao;

public class Actualizacion {
	
	private final int BUFFER_SIZE = 1024;
	private Properties propiedades;
	private BdDao database;

	public Actualizacion(BdDao database) {
		this.propiedades = new Properties();
		this.database = database;
	}
	
	public void actualizarBD() {		
		try{
//    		propiedades.load(new FileInputStream("/home/insur/Escritorio/Lista de Precios/configuration.properties"));
			propiedades = Propiedades.obtenerPropiedades();
			String direccion_web = propiedades.getProperty("direccion_web");
			String puerto = propiedades.getProperty("puerto");
			
	        if(FuncionesUtiles.comprobarConexion(direccion_web, Integer.parseInt(puerto))) {
	        	System.out.println("Conexion establecida.");
	        	descargarVersion();
	        	if(hayNuevaVersion()) {
		        	descargarSQL();
		        	descomprimirSQL();
		        	database.resetDataBase();
	        	} else
	        		System.out.println("Usted tiene descargada la ultima version.");
	        }
	        System.out.println("Base iniciada.");
	        
	    } catch (Exception e) {
	    	e.printStackTrace();
	    }
	}

	public void descargarVersion() {
		String url = propiedades.getProperty("ultimo_script"); //direccion url del recurso a descargar
		String file = propiedades.getProperty("version"); //nombre del archivo destino
		FuncionesUtiles.descargarArchivo(url, file);
	}
	
	public boolean hayNuevaVersion() {
		Calendar ultima_version = Fecha.obtenerFecha(database.ultimaVersion());
		System.out.println(Fecha.getFechaYHoraEnNumeros(ultima_version));
		
		Calendar version_actual = versionActual();
		System.out.println(Fecha.getFechaYHoraEnNumeros(version_actual));
			
		return Fecha.compararFechas(ultima_version, version_actual);
	}
	
	private Calendar versionActual() {
		Calendar version_actual = Calendar.getInstance();
		try {
			String version = propiedades.getProperty("version");
			
			String linea = new String();
			BufferedReader input = new BufferedReader(new FileReader(version));
			linea = input.readLine();
			input.close();
			
			version_actual = Fecha.obtenerFecha(linea);
			
		} catch(Exception e) { 
            e.printStackTrace();
		}
		return version_actual;
	}
	
	public void descargarSQL() {
		String url = propiedades.getProperty("actualizacion"); //direccion url del recurso a descargar
	    String file = propiedades.getProperty("sql_comprimido"); //nombre del archivo destino
	    FuncionesUtiles.descargarArchivo(url, file);
	}
	
	public void descomprimirSQL() {
		try {
    	   String fuente = propiedades.getProperty("sql_comprimido"); //direccion url en la pc del sql descargado y comprimido
    	   String ruta_destino = propiedades.getProperty("ruta_destino");
    	   
    	   // Create a ZipInputStream to read the zip file
    	   FileOutputStream fos = null;
    	   BufferedOutputStream destino = null;
    	   FileInputStream fis = new FileInputStream(fuente);
    	   ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
    	   
    	   // Loop over all of the entries in the zip file
    	   ZipEntry entry;
    	   while((entry = zis.getNextEntry()) != null) {
    		   String file_destino = ruta_destino + File.separator + entry.getName();
    		   // Write the file to the file system
    		   fos = new FileOutputStream(file_destino);
    		   destino = new BufferedOutputStream(fos, BUFFER_SIZE);
    		   int count;
    		   byte data[] = new byte[BUFFER_SIZE];
   
    		   while((count = zis.read(data, 0, BUFFER_SIZE)) != -1)
    			   destino.write(data, 0, count);
    		   destino.flush();
    		   destino.close();
    	   }
    	   zis.close();
    
		} catch(Exception e) {
			e.printStackTrace();
		}
    }

}
